/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * 例子：
 * (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
 * (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
 *
 * @param string fmt
 */
Date.prototype.customFormat = function (fmt) {
  var o = {
      'M+': this.getMonth() + 1,
      'd+': this.getDate(),
      'h+': this.getHours(),
      'm+': this.getMinutes(),
      's+': this.getSeconds(),
      'q+': Math.floor((this.getMonth() + 3) / 3),
      'S': this.getMilliseconds()
  };
  if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, String(this.getFullYear()).substr(4 - RegExp.$1.length));
  }
  for (var k in o) {
      if (new RegExp(`(${k})`).test(fmt)) {
          fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : `00${o[k]}`.substr(String(o[k]).length));
      }
  }

  return fmt;
};

/* eslint no-unused-vars: 'off' */
const Utils = {
  queryParse: fromQuery,
  queryStringify: toQuery,
  cookieParse(cookie) {
    return cookie.split(/;\s?/).reduce((result, v, i, a) => {
      const [x, y] = v.split('=');
      result[decodeURIComponent(x)] = decodeURIComponent(y);
      return result;
    }, {});
  },
  cookieStringify(obj) {
    return Object.keys(obj).reduce((result, k) => {
      result.push(`${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`);
      return result;
    }, [])
    .join('; ');
  },
  stringFormat(str, o) {
    return str.replace(
      /{([^{}]*)}/g,
      (a, b) => {
        return o[b];
      }
    );
  },
  extractJsonp(str) {
    let p1 = str.indexOf('(') + 1;
    let p2 = str.lastIndexOf(')');
    return str.substring(p1, p2);
  },
  getRandomIntInclusive(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    // The maximum is inclusive and the minimum is inclusive
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }
};
